﻿
/////////////////////////////////////////////////////////////////
//File: ArticleHandler.cs
//Description: 这是安全控制器，使用代理模式。只有需要授权的数据才从这里读取，非授权数据请直接调用服务类。
//             CRUD授权过程：1. C,U操作要检查输入的数据是否符合授权。
//                          2. R操作要先读出目标数据，然后检查数据是否符合授权。
//                          3. D操作要先进行R操作过滤，判断输入数据是否符合授权，然后只执行符合授权的删除，忽略不符合授权的操作。
//                             为了保存程序的简洁和数据库执行效率，R过滤可以在Sql中完成。
//             
//Copyright© 2011 Moliu
//History:
//  2011-3-21 23:35:08    CodeSmith5.0.1    Original Version
//  2011-3-22 00:35:00    MoLiu             1
//  2011-4-17 13:13:15    Moliu             2
//  2011-5-10 23:13:15    Moliu             3
/////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.Security;
using System.Threading;
using MAF.Common;
using My.Blog.Domain.Entities;
using My.Blog.Domain.Interfaces;

namespace My.Blog.Business.Security
{
    public partial class ArticleSafe : IArticle
    {
        // 构造函数
        public ArticleSafe(IArticle thisObj)
        {
            _This = thisObj;
        }
        
        #region IArticle成员
        
        // Create
        // 允许角色：
        //     管理员
        //     博主
        public  object CreateArticle(ArticleInfo info )
        {
            // 权限判断
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()) || SecurityUtility.IsBlogAdmin)
            {   ;   }
            else
            {    throw new SecurityException("权限不足");   }
            
            return _This.CreateArticle(info);
        }
        
        // Update
        // 允许角色：
        //     管理员
        //     博主
        public int UpdateArticle(ArticleInfo info )
        {
            // 权限判断
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()) || SecurityUtility.IsBlogAdmin)
            {   ;   }
            else
            { info.BlogId = int.Parse(SecurityUtility.UserId); }
            
            return _This.UpdateArticle(info);
        }
        
        // Delete
        // 允许角色：
        //     管理员
        //     博主
        public int DeleteArticles(ArticleInfo info )
        {
            // 权限判断
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()) || SecurityUtility.IsBlogAdmin)
            {   ;   }
            else
            { info.BlogId = int.Parse(SecurityUtility.UserId); }
            
            return _This.DeleteArticles(info);
        }
        
        // Detail
        // 允许角色：
        //     管理员--全部
        //     博客--全部
        //     其他人--公开的
        public ArticleInfo ReadArticleByConditions( ArticleInfo info )
        {
            info = _This.ReadArticleByConditions(info);

            // 权限判断
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()) || SecurityUtility.IsBlogAdmin)
            {   ;   }
            else if (!info.IsPublished)
            { throw new SecurityException("权限不足"); }

            return info;
        }
        

        /// <summary>
        /// List
        /// 允许角色：
        ///     管理员--全部
        ///     博客--全部
        ///     其他人--公开的
        /// </summary>
        /// <param name="info">
        ///     info.BlogId
        ///     info.IsPublished
        /// </param>
        /// <param name="pageSize"></param>
        /// <param name="currentPage"></param>
        /// <returns></returns>
        public IList<ArticleInfo> ReadArticlesByConditions(ArticleInfo info, int pageSize, int currentPage )
        {
            info = SetReadArticlesPermission(info);
            return _This.ReadArticlesByConditions(info, pageSize, currentPage);
        }
        
        /// <summary>
        /// Count
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public int ReadArticlesCountByConditions( ArticleInfo info )
        {
            info = SetReadArticlesPermission(info);
            return _This.ReadArticlesCountByConditions(info);
        }
        
        #endregion 

        #region Private Member
        private IArticle _This = null;
        #endregion
        
        //================================
        // 上面是自动生成的代码,下面是手工编写的代码
        //================================     
        #region Private Method
        /// <summary>
        ///  设置列表阅读权限
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        private ArticleInfo SetReadArticlesPermission(ArticleInfo info)
        {
            if (null == info) { info = new ArticleInfo(); }
            info.IsPublished = true;        // 只允许读取公开的记录

            // 权限判断
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()) || true == SecurityUtility.IsBlogAdmin)
            {
                info.IsPublished = false;
            }

            return info;
        }
        #endregion

    }
}
    